package com.cn.appcore.utils

import android.net.Uri
import android.util.Base64
import android.util.Log
import com.cn.appcore.ext.loge
import com.cn.appcore.http.constant.HttpConstant
import java.net.URLDecoder
import java.net.URLEncoder
import java.nio.charset.StandardCharsets
import java.security.MessageDigest
import java.util.*

/**
 * 项目：JingShortVideo
 * 包名：com.cxz.kotlin.mvvm.utils
 * 类名：DecryptUtils
 * 创建时间：2022/9/19 10:48
 * 创建人 @author： xiaolin
 * 描述 ：Todo...
 */
object DecryptUtils {
    /** 加密key **/
    fun encryptionData(enstr: String, key: String = HttpConstant.signConfigKey): String {
        loge("加密前Json数据：$enstr")
        var key =HttpConstant.signConfigKey
        val encodedEnstr = URLEncoder.encode(enstr, StandardCharsets.UTF_8.toString())
        var retstr = StringBuilder()
        val strlen = encodedEnstr.length
        val keylen = key.length
        for (i in 0 until strlen) {
            val substr = encodedEnstr[i]
            val subkey = key[i % keylen]
            // 在Kotlin中，没有直接的`codeUnitAt`方法，这里使用了`Character.getNumericValue`作为示例，
            // 但这可能需要根据你的需求进行调整。你可能需要使用`substr.toInt()`或其他方式来获取字符的数值表示。
            val ret = substr.toInt() xor subkey.toInt()
            // 如果结果为0，则添加原始字符，否则添加结果字符
            retstr.append(if (ret == 0) substr else ret.toChar())
        }
        // 将结果字符串转换为UTF-8字节，然后进行Base64编码
        val encodedBytes = retstr.toString().toByteArray(StandardCharsets.UTF_8)
        val base64Str = Base64.encodeToString(encodedBytes, Base64.NO_WRAP)
        // 再次对Base64编码后的字符串进行URL编码
//        val encodedResult = URLEncoder.encode(Base64.encodeToString(base64Str.toByteArray(), Base64.NO_WRAP))
        val encodedResult = URLEncoder.encode(base64Str, StandardCharsets.UTF_8.toString())
        return encodedResult
//        for (myServiceLoader in serviceLoader) {
//            val json = myServiceLoader.encodeData(URLEncoder.encode(paras))
//            str= URLEncoder.encode(Base64.encodeToString(json.toByteArray(), Base64.NO_WRAP))
//        }
//        return str
    }

    /**
     * 解密
     */
    fun decryptData(destr: String): String {
        var key =HttpConstant.signConfigKey
        var destrDecoded = Uri.decode(destr)
        val decodedBytes = Base64.decode(destrDecoded, Base64.DEFAULT)
        val decodedString = String(decodedBytes, StandardCharsets.UTF_8)
        var retstr = ""
        var i = 0
        val strlen = decodedString.length
        val keylen = key.length

        while (i < strlen) {
            val substr = decodedString[i].toString()
            val subkey = key[i % keylen].toString()
            val ret = substr.codePointAt(0) xor subkey.codePointAt(0)
            retstr += String(Character.toChars(if (ret == 0) substr.codePointAt(0) else ret))
            i++
        }
        val result = Uri.decode(retstr)
        return result
    }
    /** sign 签名 **/
    fun setSign(time :String):String{
        var sign= HttpConstant.APP_TOKEN+"appid="+ HttpConstant.APP_ID+ "timestamp="+time+ HttpConstant.APP_TOKEN
        var setverSign= Base64.encodeToString(md5(sign).toByteArray(),Base64.NO_WRAP)
        return encryptionData(setverSign)
    }

    /** md5加密 */
    fun md5(content: String): String {
        val hash = MessageDigest.getInstance("MD5").digest(content.toByteArray())
        val hex = StringBuilder(hash.size * 2)
        for (b in hash) {
            var str = Integer.toHexString(b.toInt())
            if (b < 0x10) {
                str = "0$str"
            }
            hex.append(str.substring(str.length -2))
        }
        return hex.toString()
    }

}


